package cn.mdmbct.douyin.basis.service.interfaces;

import cn.mdmbct.douyin.basis.response.user.FansCheckRes;
import cn.mdmbct.douyin.basis.response.user.FansListRes;
import cn.mdmbct.douyin.basis.response.user.FollowingListRes;
import cn.mdmbct.douyin.basis.response.user.UserOpenInfoRes;
import cn.mdmbct.douyin.common.bean.PageCount;
import cn.mdmbct.douyin.common.enums.ApiPlatform;
import cn.mdmbct.douyin.common.exception.ApiCallException;
import cn.mdmbct.douyin.common.proxy.annotations.Mapping;
import cn.mdmbct.douyin.common.proxy.annotations.RequestParam;

/**
 * <a href="https://open.douyin.com/platform/doc/6848806527751489550">抖音OpenAPI 用户管理</a>
 *
 * @author mdmbct  mdmbct@outlook.com
 * @date 2021/4/18 11:13
 * @modified mdmbct
 * @since 1.0
 */
public interface UserManagerService {

    /**
     * <a href="https://open.douyin.com/platform/doc/6848806527751489550">获取用户信息</a>
     * <p>
     * Scope: `user_info`需要用户授权
     * <p>
     * 该接口获取用户的抖音公开信息，包含昵称、头像、性别和地区；适用于抖音。
     * <p>
     * 注意：
     * <p>
     * 抖音的OAuth API以https://open.douyin.com/开头。
     * <p>
     * 头条的OAuth API以https://open.snssdk.com/开头。
     * <p>
     * 目前只支持返回用户头像、昵称及open_id。
     * <p>
     * 西瓜的OAuth API以https://open-api.ixigua.com/开头。
     * <p>
     * 目前只支持返回用户头像、昵称及open_id。
     * <p>
     * 获取用户手机号：
     * <p>
     * 需要用户授权mobile_alert 权限
     * <p>
     * 用户授权后该接口会返回encrypt_mobile
     * <p>
     * 解密手机号，使用Aes算法解密，秘钥是clientSecret， 向量lv 是clientSecret前16字节
     *
     * @param openId      open id
     * @param apiPlatform 传{@link ApiPlatform#DOU_YIN} 或者 {@link ApiPlatform#SNS}
     * @return 用户公开信息 {@link UserOpenInfoRes.GetUserOpenInfoResData}
     * @throws ApiCallException 接口调用异常
     */
    @Mapping(value = "/oauth/userinfo")
    UserOpenInfoRes.GetUserOpenInfoResData getUserOpenInfo(@RequestParam("open_id") String openId,
                                                           ApiPlatform apiPlatform) throws ApiCallException;

    /**
     * <a href="https://open.douyin.com/platform/doc/6848806544893675533">粉丝列表</a>
     * <p>
     * Scope: `fans.list`需要用户授权
     * <p>
     * 获取用户最近的粉丝列表，不保证顺序；目前可查询的粉丝数上限5千。该接口适用于抖音。
     *
     * @param openId open id
     * @param cursor 分页游标, 第一页请求cursor是0, response中会返回下一页请求用到的cursor, 同时response还会返回has_more来表明是否有更多的数据。
     * @param count  每页数量
     * @return 粉丝信息 {@link FansListRes.GetFansListResData}
     * @throws ApiCallException 接口调用异常
     */
    @Mapping(value = "/fans/list")
    FansListRes.GetFansListResData getFansList(@RequestParam("open_id") String openId,
                                               @RequestParam long cursor,
                                               @RequestParam(method = "getValue") PageCount count) throws ApiCallException;

    /**
     * <a href="https://open.douyin.com/platform/doc/6848806523481737229">获取关注列表</a>
     * <p>
     * Scope: `following.list`需要用户授权
     * <p>
     * 获取用户的关注列表；该接口适用于抖音。
     *
     * @param openId open id
     * @param cursor 分页游标, 第一页请求cursor是0, response中会返回下一页请求用到的cursor, 同时response还会返回has_more来表明是否有更多的数据。
     * @param count  每页数量
     * @return 关注列表信息 {@link FollowingListRes.GetFollowingListResData}
     * @throws ApiCallException 接口调用异常
     */
    @Mapping(value = "/following/list")
    FollowingListRes.GetFollowingListResData getFollowingList(@RequestParam("open_id") String openId,
                                                              @RequestParam long cursor,
                                                              @RequestParam(method = "getValue") PageCount count) throws ApiCallException;

    /**
     * <a href="https://open.douyin.com/platform/doc/6940930610949048334">粉丝判断</a> <p>
     * Scope: `fans.check`需要用户授权<p>
     * 开发者应用下授权的抖音账号可根据用户的openid识别其是否关注其账号，并返回关注与否结果；（follower_open_id是否关注了open_id）<p>
     * 如关注：返回是，并返回关注时间<p>
     * 未关注：返回否<p>
     *
     * @param openId         open id
     * @param followerOpenId follower's open id
     * @return Following info {@link FansCheckRes.FansCheckResData}
     * @throws ApiCallException Mapping Call Exception{@link ApiCallException}
     */
    @Mapping(value = "/fans/check")
    FansCheckRes.FansCheckResData fansCheck(@RequestParam("open_id") String openId,
                                            @RequestParam("follower_open_id") String followerOpenId) throws ApiCallException;
}
